package com.doctor.utils;

import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.Map.Entry;

public abstract class ServletUtil {

	private static Logger logger = Logger.getLogger(ServletUtil.class);
	
	public static void writeJson(HttpServletResponse response, Object object) {
		response.addHeader("Cache-Control", "no-cache");
		response.addHeader("Pragma", "no-cache");
		response.addHeader("Expires", "-1");
		response.setContentType("text/html; charset=UTF-8");
		try {
			String json = JSON.toJSONString(object);;
			if (null != json) {
				response.getWriter().print(json);
			}
		} catch (Exception e) {
			throw new RuntimeException("writeJson error");
		}
	}
	
	public static String decode(String s){
		String rs = "";
		try {
			rs =  java.net.URLDecoder.decode(s,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			rs = "";
		}
		return rs;
	}
	
	public static void write(HttpServletResponse response, String s) {
		response.addHeader("Cache-Control", "no-cache");
		response.addHeader("Pragma", "no-cache");
		response.addHeader("Expires", "-1");
		response.setContentType("text/html; charset=UTF-8");
		try {
			if (null != s) {
				response.getWriter().print(s);
			}
		} catch (Exception e) {
			throw new RuntimeException("write error");
		}
	}
	
	public static Map getReqParaMap(HttpServletRequest request) {
		Map result = new HashMap();
		Map m_req_para = request.getParameterMap();
		try {
			for(Iterator it = m_req_para.entrySet().iterator();it.hasNext();){
				Map.Entry e = (Entry) it.next();
				result.put(e.getKey(), e.getValue()!=null?((String[])e.getValue())[0]:null);
				System.out.println(e.getKey());
				System.out.println(e.getValue());
			}
		} catch (Exception e) {
			throw new RuntimeException("getReqParaMap error");
		}
		return result;
	}

	public static String getMapParam(Map map,String paramName) {
		Object obj = map.get(paramName);
		return null == obj ? "" : obj.toString();
	}

	public static String getUserIp(HttpServletRequest request){
		String ip = request.getHeader("x-forwarded-for");

		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}

		return ip;
	}

	public static void clearSession(HttpSession session){
		Enumeration enu = session.getAttributeNames();
		while (enu.hasMoreElements()) {
			session.removeAttribute((String) enu.nextElement());
		}
	}

	/**
	 * 向指定 URL 发送POST方法的请求
	 *
	 * @param url
	 *            发送请求的 URL
	 * @param param
	 *            请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	 * @return 所代表远程资源的响应结果
	 */
	public static String sendByPost(String url, Map<String, String> parameters) {
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent",
					"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数
			StringBuffer param = new StringBuffer();
			for (String key : parameters.keySet()) {
				param.append("&");
				param.append(key).append("=").append(parameters.get(key));
			}
			conn.getOutputStream().write(param.toString().getBytes("UTF-8"));
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream(),"UTF-8"));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			logger.error("发送 POST 请求出现异常！" + e);
			e.printStackTrace();
		}
		//使用finally块来关闭输出流、输入流
		finally{
			try{
				if(out!=null){
					out.close();
				}
				if(in!=null){
					in.close();
				}
			}
			catch(IOException ex){
				ex.printStackTrace();
			}
		}
		return result;
	}

}
